
// 什么是接口§
// 在面向对象语言中，接口（Interfaces）是一个很重要的概念，它是对行为的抽象，而具体如何行动需要由类（classes）去实现（implement）。

// TypeScript 中的接口是一个非常灵活的概念，除了可用于对类的一部分行为进行抽象以外，也常用于对「对象的形状（Shape）」进行描述。


/* class Dog{
    name:string;    // 只是添加了实例属性的类型限制 => 没有赋值
    age:number|string;
    
    species:string = "Dog";  // 赋值了 (class中直接创建的变量 -> 存储)
    constructor(name:string,age:number|string){
        this.name= name;
        this.age= age;
    }
    call(){
        console.log("旺旺");
    }
    intro(){
        console.log(this.name,this.age);
    }
}


class Cat{
    name:string;    // 只是添加了实例属性的类型限制 => 没有赋值
    age:number|string;
    
    species:string = "Cat";  // 赋值了 (class中直接创建的变量 -> 存储)
    constructor(name:string,age:number|string){
        this.name= name;
        this.age= age;
    }
    call(){
        console.log("喵喵");
    }
    intro(){
        console.log(this.name,this.age);
    }
} */

/* interface AnimalCommon {
    name:string;   
    age:number|string;
    intro?():void
} 

class Dog implements AnimalCommon {
    name;    // 只是添加了实例属性的类型限制 => 没有赋值
    age;
    
    species:string = "Dog";  // 赋值了 (class中直接创建的变量 -> 存储)
    constructor(name:string,age:number|string){
        this.name= name;
        this.age= age;
    }
    call(){
        console.log("旺旺");
    }
    // intro(){
    //     console.log(this.name,this.age);
    // }
}


class Cat implements AnimalCommon{
    name;    // 只是添加了实例属性的类型限制 => 没有赋值
    age;
    
    species:string = "Cat";  // 赋值了 (class中直接创建的变量 -> 存储)
    constructor(name:string,age:number|string){
        this.name= name;
        this.age= age;
    }
    call(){
        console.log("喵喵");
    }
    intro(){
        console.log(this.name,this.age);
    }
} */


// 防盗门 和 车  => 都要有报警功能  (多个类可以公有一个接口 => 复用, 不复用也无所谓)

// interface Alarm {
//     alert(): void;
// }

// class Door {
// }

// class SecurityDoor extends Door implements Alarm {
//     alert() {
//         console.log('SecurityDoor alert');
//     }
// }

// class Car implements Alarm {
//     alert() {
//         console.log('Car alert');
//     }
// }


// 一个类可以实现多个接口

// interface Alarm {
//     alert(): void;
// }

// interface LightControl{
//     on():void,
//     off():void,
// }


// class Car implements Alarm, LightControl{
//     on() {
//         console.log("light on");
//     }
//     off(){
//         console.log("light on");
//     }
//     alert() {
//         console.log('Car alert');
//     }
// }


// 接口继承接口


interface Alarm {
    alert(): void;
}

interface LightControl {  // 只定义自己的
    on():void,
    off():void,
}

// interface LightControl extends Alarm{  // 先继承父接口,在定义自己的
//     on():void,
//     off():void,
// }


// 同时继承多个接口,没有定义自己的(可以定义)
interface All extends Alarm , LightControl {
}





class Car implements  All{
    on() {
        console.log("light on");
    }
    off(){
        console.log("light on");
    }
    alert() {
        console.log('Car alert');
    }
}






